#ifndef _SERVO_SERVO_APP_H_
#define _SERVO_SERVO_APP_H_

#include "main.h"
#include "tim.h"

/**
 ****************************************************************************************************
 * DONE 用户变量区
 ****************************************************************************************************
 */

 // 定义舵机的参数
#define SERVO_MIN_PULSE 500    // 最小脉宽 (1ms)
#define SERVO_MAX_PULSE 2500   // 最大脉宽 (2ms)
#define SERVO_PERIOD 20000     // PWM 周期 (20ms, 即 50Hz)

//-----------------------------------------------	

typedef struct {
    uint16_t min_pulse;
    uint16_t max_pulse;
    uint16_t period;
} Servo_Params;

typedef enum {
    SERVO_horizontal = 1,   //水平
    SERVO_vertical = 2      //竖直
} Servo_Direction;

extern int16_t horizontal_angle;
extern int16_t vertical_angle;

typedef struct SERVO__PWM_HandleTypeDef
{
  TIM_HandleTypeDef *htim;   /*!< PWM使用的定时器  */
  uint32_t Channel;          /*!< PWM通道         */
} SERVO_PWM_HandleTypeDef;


//-----------------------------------------------	

extern SERVO_PWM_HandleTypeDef htim_pwm_horizontal;       // PWM 定时器句柄
extern SERVO_PWM_HandleTypeDef htim_pwm_vertical;     


/**
 ****************************************************************************************************
 * DONE 用户函数区
 ****************************************************************************************************
 */

/**
 * @if Eng
 * @brief Initializes the servo motor system 
 * @param None
 * @result None
 * @else
 * @brief 初始化舵机系统 
 * @param 无 
 * @result 无 
 * @endif 
 */
void Servo_Init(void);

/**
 * @if Eng
 * @brief Sets the angle of a specified servo motor 
 * @param angle - Target angle to set (in degrees)
 * @param servo_num - Identifier of the servo to control (Servo_Direction enum)
 * @result None
 * @else
 * @brief 设置指定舵机的角度
 * @param angle - 目标角度（单位：度）
 * @param servo_num - 要控制的舵机标识（Servo_Direction枚举）
 * @result 无
 * @endif 
 */
void Servo_SetAngle(float angle, Servo_Direction servo_num);

/**
 * @if Eng
 * @brief Advanced control of servo motor with joystick input
 * @param joy_val - Joystick input value (0-1023 or similar range)
 * @param servo_id - Identifier of the servo to control (Servo_Direction enum)
 * @param Control_mode - Control mode selector (different control algorithms)
 * @result None
 * @else
 * @brief 通过摇杆输入高级控制舵机
 * @param joy_val - 摇杆输入值（0-1023或类似范围）
 * @param servo_id - 要控制的舵机标识（Servo_Direction枚举）
 * @param Control_mode - 控制模式选择器（不同的控制算法）
 * @result 无
 * @endif 
 */
void Servo_Control_Advanced(uint16_t joy_val, Servo_Direction servo_id,uint16_t Control_mode);

/**
 * @if Eng
 * @brief Controls vertical axis servo with joystick input 
 * @param joy_val - Joystick input value for vertical control 
 * @result None
 * @else
 * @brief 通过摇杆输入控制垂直轴舵机
 * @param joy_val - 垂直控制的摇杆输入值 
 * @result 无
 * @endif 
 */
void Servo_Control_vertical(uint16_t joy_val);

/**
 * @if Eng
 * @brief Controls horizontal axis servo with joystick input 
 * @param joy_val - Joystick input value for horizontal control
 * @result None
 * @else
 * @brief 通过摇杆输入控制水平轴舵机 
 * @param joy_val - 水平控制的摇杆输入值 
 * @result 无
 * @endif 
 */
void Servo_Control_horizontal(uint16_t joy_val);

#endif
